package tk.mynoteapp.dev.other.eliminateifelse.right.dynamicjoinbeanname;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Service;

/**
 * 2、动态拼接名称
 * 该方法主要针对code是有业务含义的场景
 * 支付类bean的名称是由code和后缀拼接而成，比如：aliPay、weixinPay和jingDongPay。这就要求支付类取名的时候要特别注意，前面的一段要和
 * code保持一致。调用的支付类的实例是直接从ApplicationContext实例中获取的，默认情况下bean是单例的，放在内存的一个map中，所以不会有性能问题
 *
 */
@Service
public class PayService implements ApplicationContextAware {
    private ApplicationContext applicationContext;
    private static final String SUFFIX = "Pay";

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    public void toPay(String payCode) {
        applicationContext.getBean(getBeanName(payCode), IPay.class).pay();
    }

    public String getBeanName(String payCode) {
        return payCode + SUFFIX;
    }
}
